class MagicBox:
    def __init__(self, items):
        self.items = items if items is not None else []

    def __str__(self):
        # 返回对象的数据内容
        return str(self.items)

    def __len__(self):
        # 返回对象的长度
        return len(self.items)

    def __getitem__(self, index):
        # 通过角标/键获取元素
        return self.items[index]

    def __setitem__(self, key, value):
        # 通过角标/键修改元素
        self.items[key] = value

    def __delitem__(self, key):
        # 通过角标/键删除元素
        del self.items[key]

    def __contains__(self, item):
        # 判断元素存在性
        return item in self.items

    def __iter__(self):
        # 返回迭代器 支持for循环
        return iter(self.items)

    def __next__(self):
        # 迭代器下一个元素配合__iter__使用
        return next(iter(self.items))

    def __add__(self, other):
        # 两个对象相加 other另一个对象 生成一个新的对象
        # __sub__ 减法 __mul__ 乘法 __truediv__ 除法
        if isinstance(other, MagicBox):
            itemA = self.items
            itemB = other.items
            itemC = itemA + itemB
            return MagicBox(itemC)

    def __eq__(self, other):
        # 比较两个对象的相等性
        if isinstance(other, MagicBox):
            return self.items == other.items

    def __lt__(self, other):
        # 比较当前对象是否小于other <
        # __gt__ >
        return self.items < other.items
    """
        __call__ 将对象作为函数调用 box()
        __bool__ 将对象作为布尔比较结果 if box:
        __hash__ 计算对象的哈希值 {box:1, "name":"张三"}
        __new__ 在内存中创建对象 实际上在__init__中就已经使用了 
        ......
    """

box = MagicBox([1, 2, 3])
print(box)  # 调用__str__函数
print(len(box))  # 调用__len__函数
print(box[0])  # 调用__getitem__函数
box[0] = 10  # 调用__setitem__函数
print(box[0])
del box[0]  # __delitem__
print(box)
print(4 in box)
for b in box:  # __getitem__
    print(b)
it = iter(box)  # __iter__
print(next(it))  # __next__
print(next(it))
box2 = MagicBox([4, 5, 6])
box3 = box + box2  # __add__
print(box3)
box4 = MagicBox([2, 3, 4, 5, 6])
print(box3 == box4)  # __eq__
print(box4 == box2)
print(box2 < box4)